
package model.persistencia;

import java.sql.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import model.CategoriaModel;
import model.ICategoria;

public class CategoriaDAO implements IGenericDAO {      
    
    private Statement stmt;
    private Connection con;
    private PreparedStatement ps;
    private BancoDeDados conexaoBanco;    
    private ResultSet resultado;
    private ICategoria categoria;

    public CategoriaDAO(ICategoria categoria) {
        conexaoBanco = new BancoDeDados(); 
        this.categoria = categoria;
        
    }

    @Override
    public void inserir() {
        con = null;
        ps = null;            
        con = conexaoBanco.getConexao();              
        String sql = "INSERT INTO categoria(categoria_pk, descricao) VALUES (?, ?);";                   
        try {
            ps = con.prepareStatement(sql);            
            ps.setInt(1, categoria.getCodigo());
            ps.setString(2, categoria.getDescricao());                                    
            ps.execute();            
        } catch (SQLException ex) {
            Logger.getLogger(CategoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro no no banco no cadastro de Categoria:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                ps.close();
                con.close();                
                stmt.close();
            } catch (SQLException ex) {
                Logger.getLogger(CategoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }
    }

    @Override
    public void excluir() {
        con = null;
        ps = null;
        con = conexaoBanco.getConexao(); 
        String sql = "DELETE FROM categoria WHERE categoria_pk = "+categoria.getCodigo()+";";  
        try {
            ps = con.prepareStatement(sql);
            ps.execute();
        } catch (SQLException ex) {
            Logger.getLogger(CategoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro no no banco no Exclusão de Categoria:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(CategoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }           
        }
    }

    @Override
    public void atualizar() {
        con = null;
        ps = null;       
        con = conexaoBanco.getConexao();         
        String sql = "UPDATE categoria SET descricao=? WHERE categoria_pk=?;";        
        try{
            ps = con.prepareStatement(sql);                        
            ps.setString(1, categoria.getDescricao());       
            ps.setInt(2, categoria.getCodigo());
            ps.executeUpdate();            
        }catch(SQLException ex) {
            Logger.getLogger(CategoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro ao execultar a Atualização de Categoria:\n"+
                    ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                ps.close();
                con.close();                
            } catch (SQLException ex) {
                Logger.getLogger(CategoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }
    }   

    @Override
    public ArrayList pesquisar(int iOpcao, String iPesquisa) {
        ArrayList listaCategoria = new ArrayList();        
        resultado = null;
        con = null;        
        stmt = null;                           
        con = conexaoBanco.getConexao();                       
        try{        
            stmt = (Statement) con.createStatement();
            resultado = stmt.executeQuery(getSQL(iOpcao, iPesquisa));                                   
            while(resultado.next()) {
                ICategoria categoriaTemp = new CategoriaModel();            
                categoriaTemp.setCodigo(resultado.getInt("categoria_pk"));                
                categoriaTemp.setDescricao(resultado.getString("descricao"));                
                listaCategoria.add(categoriaTemp);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CategoriaDAO.class.getName()).log(Level.SEVERE, null, ex);            
            JOptionPane.showMessageDialog(null, "Erro na Pesquisa de Categorias.\n"+
                    ex.getMessage(),"Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                stmt.close();
                resultado.close();
            } catch (SQLException ex) {
                Logger.getLogger(CategoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }
        }               
        return listaCategoria;
    }

    @Override
    public String getSQL(int iOpcao, String iPesquisa) {
        String sql = null;        
        switch (iOpcao){
            case ICategoria.SQL_PRIMEIRO: sql = "SELECT MIN(categoria.categoria_pk) as categoria_pk FROM public.categoria;";break;
            case ICategoria.SQL_ANTERIOR: sql = "SELECT MAX(categoria.categoria_pk) as categoria_pk FROM public.categoria WHERE categoria.categoria_pk < "+ 
                    String.valueOf(iPesquisa) +";";break;
            case ICategoria.SQL_PROXIMO: sql = "SELECT MIN(categoria.categoria_pk) as categoria_pk FROM public.categoria WHERE categoria.categoria_pk > "+ 
                    String.valueOf(iPesquisa) +";";break;
            case ICategoria.SQL_ULTIMO: sql = "SELECT MAX(categoria.categoria_pk) as categoria_pk FROM public.categoria;";break;
            case ICategoria.SQL_CODIGO: sql = "SELECT categoria.categoria_pk, categoria.descricao FROM public.categoria "
                    + "WHERE categoria.categoria_pk = "+ iPesquisa +";";break;
            case ICategoria.SQL_DESCRICAO: sql = "SELECT categoria.categoria_pk, categoria.descricao FROM public.categoria "
                    + "WHERE categoria.descricao like '%"+ iPesquisa +"%' ORDER BY categoria.categoria_pk;";break;    
            case ICategoria.SQL_GETALL: sql = "SELECT categoria.categoria_pk, categoria.descricao FROM public.categoria;";break;    
        }        
        return sql;
    }

    @Override
    public int getCodigo(int iOpcao, int iCodigoAtual) {
        stmt = null;
        resultado = null;
        con = null;        
        con = conexaoBanco.getConexao(); 
        int codigoEncontrado = -1;        
        try{        
            stmt = (Statement) con.createStatement();
            resultado = stmt.executeQuery(getSQL(iOpcao, String.valueOf(iCodigoAtual)));        
            resultado.next();
            codigoEncontrado = resultado.getInt("categoria_pk");
        }catch(SQLException ex) {
            Logger.getLogger(CategoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro ao execultar a sql de navegação:\n"+
                    ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                stmt.close();
                resultado.close();
            } catch (SQLException ex) {
                Logger.getLogger(CategoriaDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }        
        return codigoEncontrado;  
    }

    @Override
    public CategoriaModel getObject(int id) {
        ArrayList<CategoriaModel> listaCategorias;        
        listaCategorias = pesquisar(ICategoria.SQL_CODIGO, String.valueOf(id));
        CategoriaModel categoriaTemp;        
        categoriaTemp = listaCategorias.get(0);
        return categoriaTemp;
    }
    
}
